{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DFT TESTBENCH\n",
    "\n",
    "This notebook takes two inputs (real and imaginary) and gived the real and imaginary parts of the DFT outputs using AXI-STREAM. It is then compared with software version of FFT"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "\n",
       "require(['notebook/js/codecell'], function(codecell) {\n",
       "  codecell.CodeCell.options_default.highlight_modes[\n",
       "      'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n",
       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
       "      Jupyter.notebook.get_cells().map(function(cell){\n",
       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
       "  });\n",
       "});\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from pynq import Overlay\n",
    "import numpy as np\n",
    "from pynq import Xlnk\n",
    "from pynq.lib import dma\n",
    "from scipy.linalg import dft\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "ol=Overlay('dft.bit')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "dma1=ol.axi_dma_0\n",
    "dma2=ol.axi_dma_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "NUM_SAMPLES = 1024\n",
    "\n",
    "real_error=np.zeros(NUM_SAMPLES)\n",
    "imag_error=np.zeros(NUM_SAMPLES)\n",
    "ind=np.arange(NUM_SAMPLES)\n",
    "real_rmse=np.zeros(NUM_SAMPLES)\n",
    "imag_rmse=np.zeros(NUM_SAMPLES)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "xlnk = Xlnk()\n",
    "in_r = xlnk.cma_array(shape=(NUM_SAMPLES,), dtype=np.float32) \n",
    "in_i = xlnk.cma_array(shape=(NUM_SAMPLES,), dtype=np.float32)           \n",
    "out_r = xlnk.cma_array(shape=(NUM_SAMPLES,), dtype=np.float32) \n",
    "out_i = xlnk.cma_array(shape=(NUM_SAMPLES,), dtype=np.float32)\n",
    "a = [i for i in range(NUM_SAMPLES)]\n",
    "a=np.cos(a)\n",
    "real=a.real                # Change input real and imaginary value here\n",
    "img=a.imag\n",
    "np.copyto(in_r, real)\n",
    "np.copyto(in_i, img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "dft_ip = ol.dft_0\n",
    "dft_ip.write(0x00,1)\n",
    "dma2.recvchannel.start()\n",
    "dma2.sendchannel.start()                # Start the DMA send and recv channels.\n",
    "dma1.recvchannel.start()\n",
    "dma1.sendchannel.start()\n",
    "\n",
    "dma2.recvchannel.transfer(out_i)        #Send and recv data \n",
    "dma2.sendchannel.transfer(in_i)\n",
    "dma1.recvchannel.transfer(out_r)\n",
    "dma1.sendchannel.transfer(in_r)\n",
    "\n",
    "dma2.recvchannel.wait()\n",
    "dma2.sendchannel.wait()                # Wait for the DMA to send and recv data.\n",
    "dma1.recvchannel.wait()\n",
    "dma1.sendchannel.wait()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Verifying Functionality "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "golden_op=np.fft.fft(a)\n",
    "\n",
    "for i in range(NUM_SAMPLES):\n",
    "\n",
    "    real_error[i]=\"{0:.6f}\".format(abs(out_r[i]-golden_op.real[i]))\n",
    "    imag_error[i]=\"{0:.6f}\".format(abs(out_i[i]-golden_op.imag[i]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Real Part RMSE:  1.20132982955e-05 Imaginary Part RMSE: 4.89598847272e-06\n",
      "PASS\n"
     ]
    }
   ],
   "source": [
    "sum_sq_real=0\n",
    "sum_sq_imag=0\n",
    "for i in range(NUM_SAMPLES):\n",
    "    sum_sq_real =sum_sq_real+(real_error[i]*real_error[i])\n",
    "    real_rmse = np.sqrt(sum_sq_real / (i+1))\n",
    "    sum_sq_imag =sum_sq_imag+(imag_error[i]*imag_error[i])\n",
    "    imag_rmse = np.sqrt(sum_sq_imag / (i+1))\n",
    "print(\"Real Part RMSE: \", real_rmse, \"Imaginary Part RMSE:\", imag_rmse)    \n",
    "if real_rmse<0.001 and imag_rmse<0.001:\n",
    "    print(\"PASS\")\n",
    "else:\n",
    "    print(\"FAIL\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Displaying Error and Output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xac613f30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 5))\n",
    "plt.subplot(1,2,1)\n",
    "plt.bar(ind,real_error)\n",
    "plt.title(\"Real Part Error\")\n",
    "plt.xlabel(\"Index\")\n",
    "plt.ylabel(\"Error\")\n",
    "#plt.xticks(ind)\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.subplot(1,2,2)\n",
    "plt.bar(ind,imag_error)\n",
    "plt.title(\"Imaginary Part Error\")\n",
    "plt.xlabel(\"Index\")\n",
    "plt.ylabel(\"Error\")\n",
    "#plt.xticks(ind)\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xabc22150>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "freq=np.fft.fftfreq(1024)\n",
    "\n",
    "plt.figure(figsize=(7, 4))\n",
    "plt.subplot(1,2,1)\n",
    "plt.plot(freq,out_r,label='real')\n",
    "plt.plot(freq,out_i,label='imag')\n",
    "plt.title(\"1024-DFT\")\n",
    "plt.xlabel(\"Frequency\")\n",
    "plt.ylabel(\"DFT real and imaginary data\")\n",
    "plt.legend()\n",
    "plt.tight_layout()\n",
    "plt.subplot(1,2,2)\n",
    "plt.plot(freq,golden_op.real,label='real')\n",
    "plt.plot(freq,golden_op.imag,label='imag')\n",
    "plt.title(\"1024-FFT -Numpy\")\n",
    "plt.xlabel(\"Frequency\")\n",
    "plt.ylabel(\"FFT real and imaginary data\")\n",
    "plt.legend()\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
